package com.sheng.leetcode.year2023.month04.day03;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author liusheng
 * @date 2023/04/03
 * <p>
 * 1053. 交换一次的先前排列<p>
 * <p>
 * 给你一个正整数数组 arr（可能存在重复的元素），<p>
 * 请你返回可在 一次交换（交换两数字 arr[i] 和 arr[j] 的位置）后得到的、按字典序排列小于 arr 的最大排列。<p>
 * 如果无法这么操作，就请返回原数组。<p>
 * <p>
 * 示例 1：<p>
 * 输入：arr = [3,2,1]<p>
 * 输出：[3,1,2]<p>
 * 解释：交换 2 和 1<p>
 * <p>
 * 示例 2：<p>
 * 输入：arr = [1,1,5]<p>
 * 输出：[1,1,5]<p>
 * 解释：已经是最小排列<p>
 * <p>
 * 示例 3：<p>
 * 输入：arr = [1,9,4,6,7]<p>
 * 输出：[1,7,4,6,9]<p>
 * 解释：交换 9 和 7<p>
 * <p>
 * 提示：<p>
 * 1 <= arr.length <= 10^4<p>
 * 1 <= arr[i] <= 10^4<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/previous-permutation-with-one-swap">1053. 交换一次的先前排列</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1053 {

    @Test
    public void test01() {
//        int[] arr = {3, 2, 1};
//        int[] arr = {1, 1, 5};
        int[] arr = {1, 9, 4, 6, 7};
        System.out.println(Arrays.toString(new Solution().prevPermOpt1(arr)));
    }
}

class Solution {
    public int[] prevPermOpt1(int[] arr) {
        int length = arr.length;
        for (int i = length - 1; i > 0; i--) {
            if (arr[i] < arr[i - 1]) {
                for (int j = length - 1; j > i - 1; j--) {
                    if (arr[i - 1] > arr[j] && arr[j] != arr[j - 1]) {
                        int t = arr[i - 1];
                        arr[i - 1] = arr[j];
                        arr[j] = t;
                        return arr;
                    }
                }
            }
        }
        return arr;
    }
}
